package com.raos.example.redis.networkmodel.bio;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * BIO网络模型 -- BIO服务端
 *
 * @author raos
 * @emil 991207823@qq.com
 * @date 2021/7/23 22:02
 */
public class BIOServerSocket {

    /**
     * 测试方法：使用cmd命令窗口执行：telnet + ip port
     *  报错“'telnet' 不是内部或外部命令，也不是可运行的程序或批处理文件。”
     *  解决方案：打开控制面板，在程序中启用Window的telnet客户端。
     * @param args
     */
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8080);
            System.out.println("启动服务：监听端口:8080");
            //表示阻塞等待监听一个客户端连接,返回的socket表示连接的客户端信息
            while (true) {
                //连接阻塞
                Socket socket = serverSocket.accept();
                System.out.println("客户端：" + socket.getPort());
                // inputstream是阻塞的(***)
                // 表示获取客户端的请求报文
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String clientStr = bufferedReader.readLine();
                System.out.println("收到客户端发送的消息：" + clientStr);
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                bufferedWriter.write("receive a message: " + clientStr + "\n");
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
